#pragma once
#include "mysort.h"
#define Num 3						// 线程个数
#define STACK_SIZE 1024 * 1024		// 线程栈大小
#define CONV(v) ((struct val *)(v)) // 线程函数参数强转

// int a[Num][N];
// 栈指针数组
unsigned char *arr_stack[Num];
// tid数组,下标为id
int arr_tid[Num];
// gcnt记录第几个线程
int gcnt;

// 线程函数传入结构体
struct val
{
	int id;
	int a[N];
};

// 初始化数组
void InitA(int a[])
{

	for (int i = 0; i < N; ++i)
	{
		a[i] = (int)rand() % (int)100 + 20;
	}

	return;
}

// 睡眠i毫秒
void msleep(int i)
{
	// nanosleep所用的结构体
	struct timespec tim;
	// tv_nsec-tv_sec即休眠纳秒数
	tim.tv_sec = 0, tim.tv_nsec = 1e6L * i;
	nanosleep(&tim, 0);
}

// 多线程函数
void ChooseAndSort(void *arr)
{
	
	// exit_graphic();
	int XRst = g_graphic_dev.XResolution;
	(void)XRst;
	if (CONV(arr)->id == 0)
	{
		printf("%d:sort start\n", CONV(arr)->id);
		// msleep(1000);
		draw(CONV(arr)->a, 0, N - 1, 0, XRst / 3, cr_fr);
		BubbleSort(((struct val *)arr)->a, 0, N - 1, 0, XRst / 3, cr_fr);
		// draw(CONV(arr)->a,0,N-1,0,XRst/3,cr_fr);
	}
	else if ((CONV(arr))->id == 1)
	{
		draw(CONV(arr)->a, 0, N - 1, 1, XRst / 3, cr_fg);
		QuickSort((CONV(arr))->a, 0, N - 1, 1, XRst / 3, cr_fg);
		// draw(CONV(arr)->a,0,N-1,1,XRst/3,cr_fg);
	}
	else if ((CONV(arr))->id == 2)
	{
		draw(CONV(arr)->a, 0, N - 1, 2, XRst / 3, cr_fb);
		SelectSort((CONV(arr))->a, 0, N - 1, 2, XRst / 3, cr_fb);
		// draw(CONV(arr)->a,0,N-1,2,XRst/3,cr_fb);
	}
	else
	{
		task_exit(3);
	}
	// exit_graphic();
	task_exit(0);
}

// 申请线程栈
unsigned char *stack_new()
{
	unsigned char *stack_foo;
	unsigned int stack_size = STACK_SIZE;
	stack_foo = (unsigned char *)malloc(stack_size);
	return stack_foo;
}
// 释放线程栈
void stack_del(unsigned char *stack_foo)
{
	free(stack_foo);
}

void try();
// 多线程排序
void Sort_Mul(struct val arr[])
{
	// 进入图形模式
	init_graphic(0x188);
	// 创建线程栈，获取tid
	for (int i = 0; i < Num; ++i)
	{
		arr_stack[i] = stack_new();
		arr[i].id = i;
		InitA(arr[i].a);
		arr_tid[i] = task_create(arr_stack[i] + STACK_SIZE, ChooseAndSort, (void *)&arr[i]);
	}

	// 释放线程栈
	for (int i = 0; i < Num; ++i)
	{
		task_wait(arr_tid[i], NULL);
		stack_del(arr_stack[i]);
	}
	msleep(10000);
	exit_graphic();
}

void Debug(int a[])
{
	for (int i = 0; i < N; ++i)
	{
		printf("%d ", a[i]);
	}
	printf("\n");
}


void Lab2_Multithreading()
{
	//定义并初始化待传入的结构体
	struct val vals[Num];
	srand(time(0));
	//多线程排序
    Sort_Mul(vals);
	for(int i = 0 ; i < Num ; ++i)
	{
		Debug(vals[i].a);
        printf("\n");
	}
}